﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kooboo.Commerce.Exceptions;
using Kooboo.Commerce.AddIn;
using Kooboo.IoC;

namespace Kooboo.Commerce
{
    public static class CartCommand
    {
        //public static void Put(this ICart cart, ICartItem item)
        //{
        //    //var product = AppContext.EntityFactory.Products.Where(i => i.Id == item.Product.Id).FirstOrDefault();
        //    //if (product != null)
        //    //{

        //    //    if(product.ProductVariations.Count> 0)//first, check iff it has a price value
        //    //    {
        //    //        if(item.ProductVariation == null)
        //    //        {
        //    //            throw new MissingProductVariationException(product.Name);
        //    //        }

        //    //        var variation = product.ProductVariations.Where(i => i.Id == item.ProductVariation.Id).FirstOrDefault();

        //    //        if (variation != null)
        //    //        {
        //    //            var find = cart.Items
        //    //                .Where(i => i.ProductVariation != null)
        //    //                .Where(i => i.ProductVariation.Id == item.ProductVariation.Id)
        //    //                .FirstOrDefault();

        //    //            if (find == null)
        //    //            {
        //    //                find = AppContext.EntityFactory.Resolve<ICartItem>();
        //    //                find.ProductVariation = item.ProductVariation;
        //    //                find.Quantity = item.Quantity;
        //    //                cart.Items.Add(find);
        //    //            }
        //    //            else
        //    //            {
        //    //                find.Quantity += item.Quantity;
        //    //            }

        //    //            find.Product = product;
        //    //            find.ProductName = product.Name;
        //    //            find.SKU = variation.SKU;
        //    //            find.UnitPrice = variation.FinalPrice();
        //    //        }
        //    //    }
        //    //    else
        //    //    {
        //    //        var find = cart.Items.Where(i => i.Product.Id == item.Product.Id).FirstOrDefault();
        //    //        if (find == null)
        //    //        {
        //    //            find = AppContext.EntityFactory.Resolve<ICartItem>();

        //    //            find.Quantity = item.Quantity;
        //    //            cart.Items.Add(find);
        //    //        }
        //    //        else
        //    //        {
        //    //            find.Quantity += item.Quantity;
        //    //        }

        //    //        find.Product = product;
        //    //        find.ProductName = product.Name;
        //    //        find.SKU = product.SKU;
        //    //        find.UnitPrice = product.FinalPrice();
        //    //    }

        //    //    cart.Calculate();
        //    //    AppContext.Put(cart);
        //    //}
          

        //}

        //public static void Remove(this ICart cart, ICartItem item)
        //{
        //    var find = cart.CartItems.Where(i => i.Id == item.Id).FirstOrDefault();
        //    if (find != null)
        //    {
        //        cart.CartItems.Remove(find);
        //        cart.Calculate();
        //        ServiceFactory.GetService<CartService>().Put(cart);
        //    }
        //}

        ///// <summary>
        ///// update cart item's Quantity
        ///// </summary>
        ///// <param name="cart"></param>
        ///// <param name="item"></param>
        //public static void Update(this ICart cart, ICartItem item)
        //{
        //    var find = cart.CartItems.Where(i => i.Id == item.Id).FirstOrDefault();

        //    if (find != null && find.Quantity != item.Quantity)
        //    {
        //        find.Quantity = item.Quantity;
        //        cart.Calculate();

        //        ServiceFactory.GetService<CartService>().Put(cart);
        //    }
        //}


        //public static void Checkout(this ICart cart)
        //{
        //    ServiceFactory.GetService<CartService>().Put(cart);
        //}

        //public static void Shipping(this ICart cart)
        //{

        //    cart.Calculate();
        //    ServiceFactory.GetService<CartService>().Put(cart);
        //}

        //public static void Payment(this ICart cart)
        //{
        //    cart.Calculate();
        //    ServiceFactory.GetService<CartService>().Put(cart);
        //}


      

        ////public static IPayment FindPayment(this ICart cart)
        ////{
        ////    return ServiceFactory
        ////        .GetService<PaymentService>()
        ////        .QueryService
        ////        .Where(i => i.MethodName == cart.PaymentName)
        ////        .FirstOrDefault();

        ////}

        //public static IOrder Order(this ICart cart)
        //{

        //    ServiceFactory.GetService<CartService>().Put(cart);

        //    var order = ObjectContainer.CreateInstance<IOrder>();
        //    order.Cart = cart;
        //    order.Address1 = cart.Address1;
        //    order.Address2 = cart.Address2;
        //    order.City = cart.City;

        //    //order.Country = cart.Country;
        //    order.Coupon = cart.Coupon;
            
        //    order.Customer = cart.Customer;
            
        //    order.FirstName = cart.FirstName;
        //    order.InsuredAmount = cart.InsuredAmount;
        //    order.InvoiceAddress1 = cart.InvoiceAddress1;
        //    order.InvoiceAddress2 = cart.InvoiceAddress2;
        //    order.InvoiceCity = cart.InvoiceCity;
        //   // order.InvoiceCountry = cart.InvoiceCountry;
        //    order.InvoiceFirstName = cart.InvoiceFirstName;
        //    order.InvoiceLastName = cart.InvoiceLastName;
        //    order.InvoicePhone = cart.InvoicePhone;
        //    order.InvoicePostcode = cart.InvoicePostcode;
        //    order.InvoiceState = cart.InvoiceState;
        //    order.IsCompleted = false;
        //    order.LastName = cart.LastName;

        //    order.OrderDate = DateTime.Now;

        //    order.Discount = cart.Discount;
        //    order.OrderStatus = OrderStatus.PaymentPending;
        //    order.PaymentMethodCost = cart.PaymentMethodCost;
        //    order.PaymentName = cart.PaymentName;
        //  //  order.PaymentStatus = PaymentStatus.Waiting;
        //    order.Phone = cart.Phone;
        //    order.Postcode = cart.Postcode;
        //    order.Remark = cart.Remark;
        //    order.ShippingCost = cart.ShippingCost;
        //    order.State = cart.State;
        //    order.Total = cart.Total;
        //    order.TotalDiscount = cart.TotalDiscount;
        //    order.TotalTaxCost = cart.TotalTaxCost;
            

          
        //    ServiceFactory
        //        .GetService<OrderService>()
        //        .Post(order);

        //    return order;
        //}


        //public static void Calculate(this ICart cart)
        //{
        //    cart.Total = 0;

        //    cart.TotalTaxCost = 0;
        //    cart.ShippingCost = 0;
        //    cart.PaymentMethodCost = 0;
        //    cart.Discount = 0;
        //    cart.SubTotal = 0;
        //    cart.TotalDiscount = 0;

        //    //total
        //    foreach (var i in cart.CartItems)
        //    {
        //        i.SubTotal = i.UnitPrice * i.Quantity;
        //        i.Discount = 0;
        //    }

        //    //todo: update shipping cost
        //    //shipping cost
         

        //    var context = new PromotionContext();
         
        //    context.Status = CheckoutStatus.Total;
        //    //discount for product
        //    cart.ExecutePromotions(context);
            
        //    //tax cost
        //    foreach (var i in cart.CartItems)
        //    {
        //        //var tax = i.FindTax(cart.Country, cart.State);
        //        //if (tax == null)
        //        //{
        //        //    i.TaxCost = 0;
        //        //}
        //        //else
        //        //{
        //        //    i.TaxCost = (i.SubTotal - i.Discount) * tax.Percent / 100;
        //        //}

        //        i.Total = i.SubTotal + i.TaxCost - i.Discount;
        //    }

        //    ReTotal(cart);

        //    context.Status = CheckoutStatus.Tax;
        //    //discount for tax
        //    cart.ExecutePromotions(context);

            
        //    //payment cost
        //    var serviceHost = new ServiceHost();
        //    var method = serviceHost.LocatePayment(cart);
            
        //    if (method != null && method.IsEnable)
        //    {
        //        if (method.AmountChange.HasValue)
        //        {
        //            cart.PaymentMethodCost = method.AmountChange.Value;
        //        }
        //        else
        //        {
        //            if (method.PercentChange.HasValue)
        //            {
        //                cart.PaymentMethodCost = (cart.Total + cart.ShippingCost) * method.PercentChange.Value / 100;
        //            }
        //            else
        //            {
        //                cart.PaymentMethodCost = decimal.Zero;
        //            }
        //        }

        //    }

        //    context.Status = CheckoutStatus.Pay;
        //    //discount for payment cost
        //    cart.ExecutePromotions(context);


        //    ReTotal(cart);
        //}

        //private static List<string> ExecutePromotions(this ICart cart, PromotionContext context)
        //{
        //    var user = ContextContainer.Current.Resolve<Kooboo.Connect.User>();
        //    var errors = new List<string>();

        //    var service = ServiceFactory.GetService<PromotionRuleService>();


        //    foreach (var i in service.QueryService.Where(i => i.IsEnable).OrderByDescending(i => i.Priority))
        //    {
        //        var promotion = i.FindPromotion();
        //        if (promotion != null)
        //        {
        //            promotion.Execute(cart, i, user, context);
        //        }
        //    }

        //    return errors;
        //}

        //private static void ReTotal(ICart cart)
        //{
        //    cart.Total = 0;
        //    cart.TotalTaxCost = 0;
        //    cart.SubTotal = 0;
        //    cart.TotalDiscount = 0;

        //    foreach (var i in cart.CartItems)
        //    {
        //        //product sub total
        //        i.SubTotal = i.UnitPrice * i.Quantity;
          
        //        //total = subtotal - discount + tax
        //        i.Total = i.SubTotal - i.Discount + i.TaxCost;

        //        //tax
        //        cart.TotalTaxCost += i.TaxCost;
        //        //discount
        //        cart.TotalDiscount += i.Discount;
        //        //product sub total
        //        cart.SubTotal += i.SubTotal;
        //    }

        //    cart.TotalDiscount += cart.Discount;

        //    cart.Total = cart.SubTotal + cart.TotalTaxCost - cart.TotalDiscount;
        //}
    }
}
